package com.edu.exam.entity.grading.export;

import com.edu.exam.enums.grading.export.ExportType;
import com.edu.exam.enums.GradeExportPermissionLevel;
import com.edu.exam.enums.GradeExportPermissionStatus;
import com.edu.exam.enums.GradeExportPermissionType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩导出权限实体类
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_export_permission</p>
 *
 * <p>成绩导出权限实体用于管理用户的成绩导出权限，包含
 * 权限分配、访问控制、有效期管理等。为成绩导出功能提供安全控制。</p>
 *
 * <p>核心功能：
 * - 权限管理：管理用户的导出权限
 * - 访问控制：控制用户对导出功能的访问
 * - 有效期管理：管理权限的有效时间
 * - 范围限制：限制权限的适用范围
 * - 审计追踪：记录权限变更历史</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeExportPermission {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 用户ID
     *
     * <p>权限所属的用户ID。</p>
     */
    @Column(name = "user_id", nullable = false, length = 50)
    private String userId;

    /**
     * 导出类型
     *
     * <p>权限控制的导出类型。
     * 支持的类型：GRADE（成绩数据）、ANALYSIS（分析结果）、REPORT（报告数据）、STATISTICS（统计数据）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "export_type", nullable = false, length = 20)
    private ExportType exportType;

    /**
     * 权限类型
     *
     * <p>权限的类型标识。
     * 支持的类型：READ（只读）、WRITE（读写）、DELETE（删除）、ADMIN（管理）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "permission_type", nullable = false, length = 20)
    private GradeExportPermissionType permissionType;

    /**
     * 权限状态
     *
     * <p>权限的当前状态。
     * 支持的状态：REQUESTED（已申请）、REVIEWING（审核中）、APPROVED（已批准）、REJECTED（已拒绝）、ACTIVE（激活）、SUSPENDED（暂停）、EXPIRED（已过期）、REVOKED（已撤销）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false, length = 20)
    @Builder.Default
    private GradeExportPermissionStatus status = GradeExportPermissionStatus.REQUESTED;

    /**
     * 授权时间
     *
     * <p>权限被授权的时间。</p>
     */
    @Column(name = "grant_time", nullable = false)
    private LocalDateTime grantTime;

    /**
     * 过期时间
     *
     * <p>权限的过期时间。</p>
     */
    @Column(name = "expire_time")
    private LocalDateTime expireTime;

    /**
     * 授权人
     *
     * <p>授权权限的管理员ID。</p>
     */
    @Column(name = "granted_by", nullable = false, length = 50)
    private String grantedBy;

    /**
     * 审批人
     *
     * <p>审批权限的管理员ID。</p>
     */
    @Column(name = "approved_by", length = 50)
    private String approvedBy;

    /**
     * 审批时间
     *
     * <p>权限被审批的时间。</p>
     */
    @Column(name = "approve_time")
    private LocalDateTime approveTime;

    /**
     * 审批意见
     *
     * <p>权限审批的意见和说明。</p>
     */
    @Column(name = "approve_comment", length = 500)
    private String approveComment;

    /**
     * 权限范围
     *
     * <p>权限的适用范围，JSON格式存储。</p>
     */
    @Lob
    @Column(name = "permission_scope", columnDefinition = "TEXT")
    private String permissionScope;

    /**
     * 权限级别
     *
     * <p>权限的级别标识。
     * 支持的级别：BASIC（基础）、INTERMEDIATE（中级）、ADVANCED（高级）、ADMIN（管理）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "permission_level", nullable = false, length = 20)
    @Builder.Default
    private GradeExportPermissionLevel permissionLevel = GradeExportPermissionLevel.BASIC;

    /**
     * 最大记录数
     *
     * <p>单次导出允许的最大记录数。</p>
     */
    @Column(name = "max_records")
    private Integer maxRecords;

    /**
     * 最大文件大小
     *
     * <p>单次导出允许的最大文件大小（MB）。</p>
     */
    @Column(name = "max_size")
    private Integer maxSize;

    /**
     * 每日限制
     *
     * <p>每日导出次数限制。</p>
     */
    @Column(name = "daily_limit")
    private Integer dailyLimit;

    /**
     * 每月限制
     *
     * <p>每月导出次数限制。</p>
     */
    @Column(name = "monthly_limit")
    private Integer monthlyLimit;

    /**
     * IP限制
     *
     * <p>允许导出的IP地址范围，JSON格式存储。</p>
     */
    @Column(name = "ip_restrictions", columnDefinition = "TEXT")
    private String ipRestrictions;

    /**
     * 时间限制
     *
     * <p>允许导出的时间段限制，JSON格式存储。</p>
     */
    @Column(name = "time_restrictions", columnDefinition = "TEXT")
    private String timeRestrictions;

    /**
     * 数据范围限制
     *
     * <p>可导出数据的范围限制，JSON格式存储。</p>
     */
    @Column(name = "data_scope_restrictions", columnDefinition = "TEXT")
    private String dataScopeRestrictions;

    /**
     * 敏感数据权限
     *
     * <p>对敏感数据的导出权限控制。</p>
     */
    @Column(name = "sensitive_data_permission", nullable = false)
    @Builder.Default
    private Boolean sensitiveDataPermission = false;

    /**
     * 是否需要审批
     *
     * <p>标记导出是否需要额外审批。</p>
     */
    @Column(name = "requires_approval", nullable = false)
    @Builder.Default
    private Boolean requiresApproval = false;

    /**
     * 使用次数统计
     *
     * <p>权限使用次数的统计。</p>
     */
    @Column(name = "usage_count", nullable = false)
    @Builder.Default
    private Integer usageCount = 0;

    /**
     * 最后使用时间
     *
     * <p>权限最后被使用的时间。</p>
     */
    @Column(name = "last_used_time")
    private LocalDateTime lastUsedTime;

    /**
     * 使用日志
     *
     * <p>权限使用的历史日志，JSON格式存储。</p>
     */
    @Lob
    @Column(name = "usage_log", columnDefinition = "TEXT")
    private String usageLog;

    /**
     * 备注
     *
     * <p>权限的备注信息。</p>
     */
    @Column(name = "remark", length = 500)
    private String remark;

    /**
     * 附加权限
     *
     * <p>附加的权限配置，JSON格式存储。</p>
     */
    @Lob
    @Column(name = "additional_permissions", columnDefinition = "TEXT")
    private String additionalPermissions;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建人
     */
    @Column(name = "created_by", length = 50)
    private String createdBy;

    /**
     * 更新人
     */
    @Column(name = "updated_by", length = 50)
    private String updatedBy;

    /**
     * 版本号
     *
     * <p>权限记录的版本号。</p>
     */
    @Version
    @Column(name = "version", nullable = false)
    @Builder.Default
    private Integer version = 1;

    /**
     * 是否删除
     *
     * <p>逻辑删除标记。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    @Builder.Default
    private Boolean isDeleted = false;



}
